<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: flow::net_flow::Drop_timer Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="namespaceflow.html">flow</a></li><li class="navelem"><a class="el" href="namespaceflow_1_1net__flow.html">net_flow</a></li><li class="navelem"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html">Drop_timer</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="summary">
<a href="#pub-types">Public Types</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
<a href="#pri-types">Private Types</a> &#124;
<a href="#pri-methods">Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a> &#124;
<a href="classflow_1_1net__flow_1_1Drop__timer-members.html">List of all members</a>  </div>
  <div class="headertitle"><div class="title">flow::net_flow::Drop_timer Class Reference</div></div>
</div><!--header-->
<div class="contents">

<p>Internal <code><a class="el" href="namespaceflow_1_1net__flow.html" title="Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...">net_flow</a></code> class that maintains the Drop Timer for DATA packet(s) to have been sent out over a connection but not yet acknowledged by the receiver.  
 <a href="classflow_1_1net__flow_1_1Drop__timer.html#details">More...</a></p>

<p><code>#include &lt;<a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for flow::net_flow::Drop_timer:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer__inherit__graph.svg" width="372" height="216"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<div class="dynheader">
Collaboration diagram for flow::net_flow::Drop_timer:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer__coll__graph.svg" width="1584" height="718"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-types" name="pub-types"></a>
Public Types</h2></td></tr>
<tr class="memitem:a0930c4da4484ffc1f8bcfbc496e5ecd0"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> = <a class="el" href="classflow_1_1net__flow_1_1Sequence__number.html#ab307e12c0cf8cefbe7fb1ec8588af2a8">Sequence_number::seq_num_t</a></td></tr>
<tr class="memdesc:a0930c4da4484ffc1f8bcfbc496e5ecd0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type to uniquely identify a packet sent over the wire in the socket to which this <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> applies.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">More...</a><br /></td></tr>
<tr class="separator:a0930c4da4484ffc1f8bcfbc496e5ecd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td colspan="2" onclick="javascript:toggleInherit('pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder')"><img src="closed.png" alt="-"/>&#160;Public Types inherited from <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Drop_timer &gt; &gt;</a></td></tr>
<tr class="memitem:aa4f1af88393042e60159a3a67f0accbc inherit pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> = boost::shared_ptr&lt; Drop_timer &gt;</td></tr>
<tr class="memdesc:aa4f1af88393042e60159a3a67f0accbc inherit pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="mdescLeft">&#160;</td><td class="mdescRight">Short-hand for ref-counted pointer to mutable values of type <code>Target_type::element_type</code> (a-la <code>T*</code>).  <a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">More...</a><br /></td></tr>
<tr class="separator:aa4f1af88393042e60159a3a67f0accbc inherit pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aef7998db71c60eeb5d1e3d1a97c14886 inherit pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Const_ptr</a> = Const_target_ptr</td></tr>
<tr class="memdesc:aef7998db71c60eeb5d1e3d1a97c14886 inherit pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="mdescLeft">&#160;</td><td class="mdescRight">Short-hand for ref-counted pointer to immutable values of type <code>Target_type::element_type</code> (a-la <code>T const *</code>).  <a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">More...</a><br /></td></tr>
<tr class="separator:aef7998db71c60eeb5d1e3d1a97c14886 inherit pub_types_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a60e386c24490bd5880e9e8700e59ca6d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a60e386c24490bd5880e9e8700e59ca6d">~Drop_timer</a> ()</td></tr>
<tr class="memdesc:a60e386c24490bd5880e9e8700e59ca6d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destructor.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a60e386c24490bd5880e9e8700e59ca6d">More...</a><br /></td></tr>
<tr class="separator:a60e386c24490bd5880e9e8700e59ca6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abf88c319884e5c5eb1b8f63c646e90ad"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad">start_contemporaneous_events</a> ()</td></tr>
<tr class="memdesc:abf88c319884e5c5eb1b8f63c646e90ad"><td class="mdescLeft">&#160;</td><td class="mdescRight">Indicates the start of a series of zero or more contemporary <code>on_*()</code> event calls, to be marked as finished via <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a>.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad">More...</a><br /></td></tr>
<tr class="separator:abf88c319884e5c5eb1b8f63c646e90ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afc1bf0978b04d454f5aa228a44550565"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565">on_packet_in_flight</a> (<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> packet_id)</td></tr>
<tr class="memdesc:afc1bf0978b04d454f5aa228a44550565"><td class="mdescLeft">&#160;</td><td class="mdescRight">Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-level transport, currently UDP).  <a href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565">More...</a><br /></td></tr>
<tr class="separator:afc1bf0978b04d454f5aa228a44550565"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d1fff72b5c044cba0651de0508553e0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a5d1fff72b5c044cba0651de0508553e0">on_packet_no_longer_in_flight</a> (<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> packet_id)</td></tr>
<tr class="memdesc:a5d1fff72b5c044cba0651de0508553e0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Indicates that a packet for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> was called is now no longer considered In-flight in the <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> sense; see <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a5ea56c54a98289211fef4a672432a2ad" title="The collection of all In-flight packets, indexed by sequence number and ordered from most to least re...">Peer_socket::m_snd_flying_pkts_by_sent_when</a> for definition of In-flight.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a5d1fff72b5c044cba0651de0508553e0">More...</a><br /></td></tr>
<tr class="separator:a5d1fff72b5c044cba0651de0508553e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac5a7ab3108a915999e95ccf705006ccd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ac5a7ab3108a915999e95ccf705006ccd">on_no_packets_in_flight_any_longer</a> ()</td></tr>
<tr class="memdesc:ac5a7ab3108a915999e95ccf705006ccd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Equivalent to <code>on_packet_no_longer_in_flight(P)</code>, for all <code>P</code> currently In-flight as registered by <code>on_packet_in_flight(P)</code>.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ac5a7ab3108a915999e95ccf705006ccd">More...</a><br /></td></tr>
<tr class="separator:ac5a7ab3108a915999e95ccf705006ccd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a477fd69a6978cc228b8e80611aa234ba"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a477fd69a6978cc228b8e80611aa234ba">on_ack</a> (<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> packet_id)</td></tr>
<tr class="memdesc:a477fd69a6978cc228b8e80611aa234ba"><td class="mdescLeft">&#160;</td><td class="mdescRight">Indicates that a packet for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> was called has just been validly acked.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a477fd69a6978cc228b8e80611aa234ba">More...</a><br /></td></tr>
<tr class="separator:a477fd69a6978cc228b8e80611aa234ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a45d4cf2dfecc2cd5c35f452cd7c8d05d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d">end_contemporaneous_events</a> ()</td></tr>
<tr class="memdesc:a45d4cf2dfecc2cd5c35f452cd7c8d05d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Finishes the group started by start <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a>.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d">More...</a><br /></td></tr>
<tr class="separator:a45d4cf2dfecc2cd5c35f452cd7c8d05d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab6b96e0200579afdee1bf1ce58ab5ad2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2">done</a> ()</td></tr>
<tr class="memdesc:ab6b96e0200579afdee1bf1ce58ab5ad2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Causes the <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> to guarantee none of the action callbacks provided at construction will be called from this point on.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2">More...</a><br /></td></tr>
<tr class="separator:ab6b96e0200579afdee1bf1ce58ab5ad2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_methods_classflow_1_1log_1_1Log__context"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classflow_1_1log_1_1Log__context')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classflow_1_1log_1_1Log__context.html">flow::log::Log_context</a></td></tr>
<tr class="memitem:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#ae7100d2dd130d8f130e3e64fdb1f4fd9">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *logger=0)</td></tr>
<tr class="memdesc:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1log_1_1Log__context.html" title="Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...">Log_context</a> by storing the given pointer to a <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> and a null <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a>.  <a href="classflow_1_1log_1_1Log__context.html#ae7100d2dd130d8f130e3e64fdb1f4fd9">More...</a><br /></td></tr>
<tr class="separator:ae7100d2dd130d8f130e3e64fdb1f4fd9 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memTemplParams" colspan="2">template&lt;typename Component_payload &gt; </td></tr>
<tr class="memitem:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memTemplItemLeft" align="right" valign="top">&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#af1ac7f30ab442c3c6aa6079335df6c9a">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *logger, Component_payload component_payload)</td></tr>
<tr class="memdesc:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1log_1_1Log__context.html" title="Convenience class that simply stores a Logger and/or Component passed into a constructor; and returns...">Log_context</a> by storing the given pointer to a <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> and a new <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> storing the specified generically typed payload (an <code>enum</code> value).  <a href="classflow_1_1log_1_1Log__context.html#af1ac7f30ab442c3c6aa6079335df6c9a">More...</a><br /></td></tr>
<tr class="separator:af1ac7f30ab442c3c6aa6079335df6c9a inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a5c57a7f44959a01ca9a1c948a6686cc0">Log_context</a> (const <a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;src)</td></tr>
<tr class="memdesc:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy constructor that stores equal <code>Logger*</code> and <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> values as the source.  <a href="classflow_1_1log_1_1Log__context.html#a5c57a7f44959a01ca9a1c948a6686cc0">More...</a><br /></td></tr>
<tr class="separator:a5c57a7f44959a01ca9a1c948a6686cc0 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a3d4e624833d96bdafa1485ffff472509">Log_context</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&amp;src)</td></tr>
<tr class="memdesc:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Move constructor that makes this equal to <code>src</code>, while the latter becomes as-if default-constructed.  <a href="classflow_1_1log_1_1Log__context.html#a3d4e624833d96bdafa1485ffff472509">More...</a><br /></td></tr>
<tr class="separator:a3d4e624833d96bdafa1485ffff472509 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a5d628315d5a93908d47a281980d3113e">operator=</a> (const <a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;src)</td></tr>
<tr class="memdesc:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assignment operator that behaves similarly to the copy constructor.  <a href="classflow_1_1log_1_1Log__context.html#a5d628315d5a93908d47a281980d3113e">More...</a><br /></td></tr>
<tr class="separator:a5d628315d5a93908d47a281980d3113e inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#aae857197aecba8606c32296bc7bec308">operator=</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;&amp;src)</td></tr>
<tr class="memdesc:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Move assignment operator that behaves similarly to the move constructor.  <a href="classflow_1_1log_1_1Log__context.html#aae857197aecba8606c32296bc7bec308">More...</a><br /></td></tr>
<tr class="separator:aae857197aecba8606c32296bc7bec308 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#aa6bb8e4250586425631ef80063caf155">swap</a> (<a class="el" href="classflow_1_1log_1_1Log__context.html">Log_context</a> &amp;other)</td></tr>
<tr class="memdesc:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Swaps <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> pointers and <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> objects held by <code>*this</code> and <code>other</code>.  <a href="classflow_1_1log_1_1Log__context.html#aa6bb8e4250586425631ef80063caf155">More...</a><br /></td></tr>
<tr class="separator:aa6bb8e4250586425631ef80063caf155 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1log_1_1Logger.html">Logger</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">get_logger</a> () const</td></tr>
<tr class="memdesc:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the stored <a class="el" href="classflow_1_1log_1_1Logger.html" title="Interface that the user should implement, passing the implementing Logger into logging classes (Flow&#39;...">Logger</a> pointer, particularly as many <code>FLOW_LOG_*()</code> macros expect.  <a href="classflow_1_1log_1_1Log__context.html#af4db395042b065b00398cd59845dcb4d">More...</a><br /></td></tr>
<tr class="separator:af4db395042b065b00398cd59845dcb4d inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classflow_1_1log_1_1Component.html">Component</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">get_log_component</a> () const</td></tr>
<tr class="memdesc:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns reference to the stored <a class="el" href="classflow_1_1log_1_1Component.html" title="A light-weight class, each object storing a component payload encoding an enum value from enum type o...">Component</a> object, particularly as many <code>FLOW_LOG_*()</code> macros expect.  <a href="classflow_1_1log_1_1Log__context.html#a8a5fef42dc2cedf3c0d1a6e83beb2948">More...</a><br /></td></tr>
<tr class="separator:a8a5fef42dc2cedf3c0d1a6e83beb2948 inherit pub_methods_classflow_1_1log_1_1Log__context"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-methods" name="pub-static-methods"></a>
Static Public Member Functions</h2></td></tr>
<tr class="memitem:a64def367e38954d8a392cdf92fcc8f24"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24">create_drop_timer</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *logger_ptr, <a class="el" href="namespaceflow_1_1util.html#ac3e89a8a271b0ddc76ac2a0ce488dea4">util::Task_engine</a> *node_task_engine, <a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> *sock_drop_timeout, <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> &amp;&amp;sock, const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;err_code)&gt; &amp;<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a40029643f0a6c7a2a6b20499ca4c5a67">timer_failure</a>, const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(<a class="el" href="classbool.html">bool</a> drop_all_packets)&gt; &amp;timer_fired)</td></tr>
<tr class="memdesc:a64def367e38954d8a392cdf92fcc8f24"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> and returns a ref-counted pointer wrapping it.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24">More...</a><br /></td></tr>
<tr class="separator:a64def367e38954d8a392cdf92fcc8f24"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td colspan="2" onclick="javascript:toggleInherit('pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder')"><img src="closed.png" alt="-"/>&#160;Static Public Member Functions inherited from <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html">flow::util::Shared_ptr_alias_holder&lt; boost::shared_ptr&lt; Drop_timer &gt; &gt;</a></td></tr>
<tr class="memitem:a55a247bb8fb2ec94b7cbfdd56be65a81 inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81">ptr_cast</a> (const From_ptr &amp;ptr_to_cast)</td></tr>
<tr class="memdesc:a55a247bb8fb2ec94b7cbfdd56be65a81 inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="mdescLeft">&#160;</td><td class="mdescRight">Provides syntactic-sugary way to perform a <code>static_pointer_cast&lt;&gt;</code> from a compatible smart pointer type <code>From_ptr</code>, typically <code>From_ptr::element_type</code> being in the same class hierarchy as <code>Target_ptr::element_type</code>.  <a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81">More...</a><br /></td></tr>
<tr class="separator:a55a247bb8fb2ec94b7cbfdd56be65a81 inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a520b351b1463e585e278c8c7241b8fc8 inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Const_ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a520b351b1463e585e278c8c7241b8fc8">const_ptr_cast</a> (const From_ptr &amp;ptr_to_cast)</td></tr>
<tr class="memdesc:a520b351b1463e585e278c8c7241b8fc8 inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81" title="Provides syntactic-sugary way to perform a static_pointer_cast&lt;&gt; from a compatible smart pointer type...">ptr_cast()</a> but adds <code>const</code>-ness (immutability) to the pointed-to type.  <a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a520b351b1463e585e278c8c7241b8fc8">More...</a><br /></td></tr>
<tr class="separator:a520b351b1463e585e278c8c7241b8fc8 inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac242f13a290877e84e44165e00a5905c inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#ac242f13a290877e84e44165e00a5905c">dynamic_ptr_cast</a> (const From_ptr &amp;ptr_to_cast)</td></tr>
<tr class="memdesc:ac242f13a290877e84e44165e00a5905c inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="mdescLeft">&#160;</td><td class="mdescRight">Equivalent to <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a55a247bb8fb2ec94b7cbfdd56be65a81" title="Provides syntactic-sugary way to perform a static_pointer_cast&lt;&gt; from a compatible smart pointer type...">ptr_cast()</a> but a <code>dynamic_pointer_cast</code> instead of static.  <a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#ac242f13a290877e84e44165e00a5905c">More...</a><br /></td></tr>
<tr class="separator:ac242f13a290877e84e44165e00a5905c inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a013713e08c6537f91d6bdba29fcccdff inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Const_ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a013713e08c6537f91d6bdba29fcccdff">dynamic_const_ptr_cast</a> (const From_ptr &amp;ptr_to_cast)</td></tr>
<tr class="memdesc:a013713e08c6537f91d6bdba29fcccdff inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="mdescLeft">&#160;</td><td class="mdescRight">Identical to <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a520b351b1463e585e278c8c7241b8fc8" title="Identical to ptr_cast() but adds const-ness (immutability) to the pointed-to type.">const_ptr_cast()</a> but a <code>dynamic_pointer_cast</code> instead of static.  <a href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#a013713e08c6537f91d6bdba29fcccdff">More...</a><br /></td></tr>
<tr class="separator:a013713e08c6537f91d6bdba29fcccdff inherit pub_static_methods_classflow_1_1util_1_1Shared__ptr__alias__holder"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-types" name="pri-types"></a>
Private Types</h2></td></tr>
<tr class="memitem:ad9db6f435dfc65b7bd4b539467f1c3ec"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">timer_wait_id_t</a> = uint64_t</td></tr>
<tr class="memdesc:ad9db6f435dfc65b7bd4b539467f1c3ec"><td class="mdescLeft">&#160;</td><td class="mdescRight">The counter type used to distinguish a given <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> call from any other such call (for this object).  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">More...</a><br /></td></tr>
<tr class="separator:ad9db6f435dfc65b7bd4b539467f1c3ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-methods" name="pri-methods"></a>
Private Member Functions</h2></td></tr>
<tr class="memitem:a9c94b0191a80afb98b6da4a2d0b47a46"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9c94b0191a80afb98b6da4a2d0b47a46">Drop_timer</a> (<a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *logger, <a class="el" href="namespaceflow_1_1util.html#ac3e89a8a271b0ddc76ac2a0ce488dea4">util::Task_engine</a> *node_task_engine, <a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> *sock_drop_timeout, <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> &amp;&amp;sock, const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;err_code)&gt; &amp;<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a40029643f0a6c7a2a6b20499ca4c5a67">timer_failure</a>, const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(<a class="el" href="classbool.html">bool</a> drop_all_packets)&gt; &amp;timer_fired)</td></tr>
<tr class="memdesc:a9c94b0191a80afb98b6da4a2d0b47a46"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> as described in the factory constructor <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a9c94b0191a80afb98b6da4a2d0b47a46">More...</a><br /></td></tr>
<tr class="separator:a9c94b0191a80afb98b6da4a2d0b47a46"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4a5f0bbb91232e17e258722e4dfa237b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b">start_timer</a> ()</td></tr>
<tr class="memdesc:a4a5f0bbb91232e17e258722e4dfa237b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO value.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b">More...</a><br /></td></tr>
<tr class="separator:a4a5f0bbb91232e17e258722e4dfa237b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad655d5461aa5a6bf9a80d28e4a4fdd77"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad655d5461aa5a6bf9a80d28e4a4fdd77">disable_timer</a> ()</td></tr>
<tr class="memdesc:ad655d5461aa5a6bf9a80d28e4a4fdd77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Invalidates the running asynchronous wait on <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad5dfc3cd2f8e5e4d28c49e28ee5c221f" title="The Drop Timer itself.">m_timer</a>. Pre-condition: <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9528326a35b021bb859bed948ae3d7a4" title="Is there an active (non-obsolete, not-canceled) asynchronous wait in progress on m_timer?...">m_timer_running</a>.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ad655d5461aa5a6bf9a80d28e4a4fdd77">More...</a><br /></td></tr>
<tr class="separator:ad655d5461aa5a6bf9a80d28e4a4fdd77"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaf4f0fce1d41e16309beca40a126e2f0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0">handle_timer_firing</a> (<a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> prevent_destruction, <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">timer_wait_id_t</a> wait_id, const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;sys_err_code)</td></tr>
<tr class="memdesc:aaf4f0fce1d41e16309beca40a126e2f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (given in constructor).  <a href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0">More...</a><br /></td></tr>
<tr class="separator:aaf4f0fce1d41e16309beca40a126e2f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a40029643f0a6c7a2a6b20499ca4c5a67"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a40029643f0a6c7a2a6b20499ca4c5a67">timer_failure</a> (<a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a> prevent_destruction, const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;err_code)</td></tr>
<tr class="memdesc:a40029643f0a6c7a2a6b20499ca4c5a67"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called by boost.asio after we post it, in the event of some timer error.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a40029643f0a6c7a2a6b20499ca4c5a67">More...</a><br /></td></tr>
<tr class="separator:a40029643f0a6c7a2a6b20499ca4c5a67"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pri-attribs" name="pri-attribs"></a>
Private Attributes</h2></td></tr>
<tr class="memitem:ac3cfab1594111b3c3254eebc84591908"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespaceflow_1_1util.html#ac3e89a8a271b0ddc76ac2a0ce488dea4">util::Task_engine</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ac3cfab1594111b3c3254eebc84591908">m_node_task_engine</a></td></tr>
<tr class="memdesc:ac3cfab1594111b3c3254eebc84591908"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="classflow_1_1net__flow_1_1Node.html#af5597a417d03e2bed87cd772ef5cef29" title="The main loop engine, functioning in the single-threaded-but-asynchronous callback-based &quot;reactor&quot; st...">Node::m_task_engine</a> of the containing <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a>. Used to schedule timer events.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ac3cfab1594111b3c3254eebc84591908">More...</a><br /></td></tr>
<tr class="separator:ac3cfab1594111b3c3254eebc84591908"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad9db83f50aec60604de55d01e15ea403"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db83f50aec60604de55d01e15ea403">m_sock_drop_timeout</a></td></tr>
<tr class="memdesc:ad9db83f50aec60604de55d01e15ea403"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reference to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>'s <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a2d8aded3761028967fd3abb464e64936" title="The Drop Timeout: Time period between the next time m_snd_drop_timer schedules a Drop Timer and that ...">Peer_socket::m_snd_drop_timeout</a> data member (= DTO, Drop Timeout, RTO).  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db83f50aec60604de55d01e15ea403">More...</a><br /></td></tr>
<tr class="separator:ad9db83f50aec60604de55d01e15ea403"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7ab957ddc07d6289d1b42d6686173533"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a7ab957ddc07d6289d1b42d6686173533">m_sock</a></td></tr>
<tr class="memdesc:a7ab957ddc07d6289d1b42d6686173533"><td class="mdescLeft">&#160;</td><td class="mdescRight">The containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> (note that this is read-only access).  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a7ab957ddc07d6289d1b42d6686173533">More...</a><br /></td></tr>
<tr class="separator:a7ab957ddc07d6289d1b42d6686173533"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad5dfc3cd2f8e5e4d28c49e28ee5c221f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespaceflow_1_1util.html#ae7416d64d2989051104bb396e28e15e6">util::Timer</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad5dfc3cd2f8e5e4d28c49e28ee5c221f">m_timer</a></td></tr>
<tr class="memdesc:ad5dfc3cd2f8e5e4d28c49e28ee5c221f"><td class="mdescLeft">&#160;</td><td class="mdescRight">The Drop Timer itself.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#ad5dfc3cd2f8e5e4d28c49e28ee5c221f">More...</a><br /></td></tr>
<tr class="separator:ad5dfc3cd2f8e5e4d28c49e28ee5c221f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9528326a35b021bb859bed948ae3d7a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9528326a35b021bb859bed948ae3d7a4">m_timer_running</a></td></tr>
<tr class="memdesc:a9528326a35b021bb859bed948ae3d7a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Is there an active (non-obsolete, not-canceled) asynchronous wait in progress on <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad5dfc3cd2f8e5e4d28c49e28ee5c221f" title="The Drop Timer itself.">m_timer</a>? More precisely, this is <code>true</code> if the latest <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> call was later than the latest <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad655d5461aa5a6bf9a80d28e4a4fdd77" title="Invalidates the running asynchronous wait on m_timer. Pre-condition: m_timer_running.">disable_timer()</a> or <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0" title="Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (...">handle_timer_firing()</a>, or if <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> has been called but <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad655d5461aa5a6bf9a80d28e4a4fdd77" title="Invalidates the running asynchronous wait on m_timer. Pre-condition: m_timer_running.">disable_timer()</a> or <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0" title="Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (...">handle_timer_firing()</a> has not.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a9528326a35b021bb859bed948ae3d7a4">More...</a><br /></td></tr>
<tr class="separator:a9528326a35b021bb859bed948ae3d7a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa9af1ac250a1a40f3c8df5878e55b98c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">timer_wait_id_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aa9af1ac250a1a40f3c8df5878e55b98c">m_current_wait_id</a></td></tr>
<tr class="memdesc:aa9af1ac250a1a40f3c8df5878e55b98c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Unique (within this object) identifier of the last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> call.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#aa9af1ac250a1a40f3c8df5878e55b98c">More...</a><br /></td></tr>
<tr class="separator:aa9af1ac250a1a40f3c8df5878e55b98c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9de653d7372110ffd176ef34e916a7dd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9de653d7372110ffd176ef34e916a7dd">m_done</a></td></tr>
<tr class="memdesc:a9de653d7372110ffd176ef34e916a7dd"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>true</code> if and only if <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2" title="Causes the Drop_timer to guarantee none of the action callbacks provided at construction will be call...">done()</a> has been called. Starts at <code>false</code>, can only change to <code>true</code>.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a9de653d7372110ffd176ef34e916a7dd">More...</a><br /></td></tr>
<tr class="separator:a9de653d7372110ffd176ef34e916a7dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a21e78b9da6196043e1c05589c46911fa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;err_code)&gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a21e78b9da6196043e1c05589c46911fa">m_timer_failure</a></td></tr>
<tr class="memdesc:a21e78b9da6196043e1c05589c46911fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called on error. See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> constructor.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a21e78b9da6196043e1c05589c46911fa">More...</a><br /></td></tr>
<tr class="separator:a21e78b9da6196043e1c05589c46911fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a862595a7ec5d4bea05ad0e85c52e88ac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(<a class="el" href="classbool.html">bool</a> drop_all_packets)&gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a862595a7ec5d4bea05ad0e85c52e88ac">m_timer_fired</a></td></tr>
<tr class="memdesc:a862595a7ec5d4bea05ad0e85c52e88ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called on Drop Timeout. See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> constructor.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a862595a7ec5d4bea05ad0e85c52e88ac">More...</a><br /></td></tr>
<tr class="separator:a862595a7ec5d4bea05ad0e85c52e88ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a83bacd0cfe7c6fb6349688012d472f1f"><td class="memItemLeft" align="right" valign="top">std::set&lt; <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a83bacd0cfe7c6fb6349688012d472f1f">m_flying_packets</a></td></tr>
<tr class="memdesc:a83bacd0cfe7c6fb6349688012d472f1f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Packet IDs of packets to have been sent over wire and still considered In-flight, ordered from earliest to latest to have been sent out.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a83bacd0cfe7c6fb6349688012d472f1f">More...</a><br /></td></tr>
<tr class="separator:a83bacd0cfe7c6fb6349688012d472f1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2ae6617225acb8c4b0798f113c1827d0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a2ae6617225acb8c4b0798f113c1827d0">m_at_events_start_oldest_flying_packet</a></td></tr>
<tr class="memdesc:a2ae6617225acb8c4b0798f113c1827d0"><td class="mdescLeft">&#160;</td><td class="mdescRight">The packet ID of the least recently sent In-flight packet at last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> call; or 0 if <code>m_flying_packets.empty()</code> at the time.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a2ae6617225acb8c4b0798f113c1827d0">More...</a><br /></td></tr>
<tr class="separator:a2ae6617225acb8c4b0798f113c1827d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0d90b548d2c7062e1ac88b998a2fc1d5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0d90b548d2c7062e1ac88b998a2fc1d5">m_during_events_newest_acked_packet</a></td></tr>
<tr class="memdesc:a0d90b548d2c7062e1ac88b998a2fc1d5"><td class="mdescLeft">&#160;</td><td class="mdescRight">During the time period starting with the last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> call and ending with the subsequent <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a> call, if any &ndash; in other words, during the last contemporary events group, finished or otherwise &ndash; this is the ID of the most-recently-sent packet (highest packet ID) such that that packet was acknowledged during that time period.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#a0d90b548d2c7062e1ac88b998a2fc1d5">More...</a><br /></td></tr>
<tr class="separator:a0d90b548d2c7062e1ac88b998a2fc1d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:addd06c5f17e59cbfd70677831a66bc57"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#addd06c5f17e59cbfd70677831a66bc57">m_in_events_group</a></td></tr>
<tr class="memdesc:addd06c5f17e59cbfd70677831a66bc57"><td class="mdescLeft">&#160;</td><td class="mdescRight"><code>true</code> if and only if the last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> call exists, and either <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a> hasn't been called at all or was called before the former call.  <a href="classflow_1_1net__flow_1_1Drop__timer.html#addd06c5f17e59cbfd70677831a66bc57">More...</a><br /></td></tr>
<tr class="separator:addd06c5f17e59cbfd70677831a66bc57"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p >Internal <code><a class="el" href="namespaceflow_1_1net__flow.html" title="Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...">net_flow</a></code> class that maintains the Drop Timer for DATA packet(s) to have been sent out over a connection but not yet acknowledged by the receiver. </p>
<p >This is similar to the Retransmission Timer of TCP (although the way that timer works is not solidly standardized, though there are recommended setups in RFCs like RFC 6298). However, this applies even with retransmission disabled (which is allowed in NetFlow but not in TCP), so it would be incorrect to call it <code>Rexmit_timer</code>; on the other hand when retransmission is enabled, <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> will still be an accurate name (as a packet has to be considered Dropped before we retransmit it). <code><a class="el" href="namespaceflow_1_1net__flow.html" title="Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...">net_flow</a></code> users should not use this class directly.</p>
<p >The basic idea is: if you send a packet, and it's not acknowledged within some amount of time, then consider that packet Dropped. (At that point you can take it out of the In-flight window, or retransmit it, or whatever else is appropriate.) Beyond this concept the details are ambiguous, and there is no one right/standard/accepted answer for how it should work. For example, when to restart the timer? What to do with the timer after it fires? Etc. Therefore the class is reasonably configurable, so that we can experiment with different approaches.</p>
<p >This class works together with <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a>, <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>, and <a class="el" href="classflow_1_1net__flow_1_1Server__socket.html" title="A server socket able to listen on a single Flow port for incoming connections and return peer sockets...">Server_socket</a> and accordingly assumes very specific algorithms are used in sending and handling acknowledgments. However it could pretty easily be swapped out with another implementationr</p>
<p >A <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> works as follows. It keeps an internal timer that fires every DTO seconds, where DTO is computed externally (from SRTT, etc.). Certain events start or restart the timer (e.g., receiving an acknowledgment). Other events stop the timer (namely having no more In-flight packets). Then when the timer fires, certain actions have to be taken, such as considering packets Dropped and/or restarting the timer. Additionally the DTO value itself can be written to by <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> (e.g., timer backoff).</p>
<p >Therefore, the interface of <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> is simple: you call <code>on_...()</code>, when a Drop Timer-influencing event has occurred; and when some action needs to be taken due to a Drop Timer firing, it calls a user-supplied callback which will perform that action. The action callbacks are supplied at construction. <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> internally takes care of everything in-between: running/stopping the timer, catching the timer firing, etc. All of the "policy" about how the timer operates is also inside. Calling <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2" title="Causes the Drop_timer to guarantee none of the action callbacks provided at construction will be call...">done()</a> means the socket is done, and no action callbacks will subsequently fire.</p>
<p >To schedule the timer, <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> shares <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a>'s main event queue (<a class="el" href="classflow_1_1net__flow_1_1Node.html#af5597a417d03e2bed87cd772ef5cef29" title="The main loop engine, functioning in the single-threaded-but-asynchronous callback-based &quot;reactor&quot; st...">Node::m_task_engine</a>).</p>
<h3>Thread safety</h3>
<p >To be used in the containing <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a>'s thread W only.</p>
<h2>Implementation notes </h2>
<p >Having written this class, it looks over-engineered. The code would be shorter (no <code>shared_ptr</code>, callbacks, factory, <code>enable_shared_from_this</code>) if it were directly in <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a> and <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>. On the other hand the Strategy Pattern setup used here is nice for segregating the Drop Timer logic and for future modification, and it does make <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a> (which is huge) much easier to understand. So could go either way... rewrite in <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a> and <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> or leave it alone.</p>
<p >We use a <code>Ptr</code>-emitting factory, because wrapping the object in a <code>Ptr</code> helps with some internal book-keeping and is useful to the user as well.</p>
<h3>Regarding events</h3>
<p >You'll note the interface is extremely simple: essentially, outside code just registers whenever packet becomes In-flight (a/k/a is sent over wire); and the opposite. This simplicity comes at an implementation cost, because it requires us to keep &ndash; <em>internally</em> &ndash; an ordered (by send time) set of packets currently In-flight. Why do this? Because the true events we are interested in are slightly more complex than what the <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> API exposes: we want to detect when no packets are In-flight and suddenly a packet is sent off; the reverse; the acknowledgment of a packet that is NOT the oldest one currently In-flight; and the changing of the oldest currently In-flight packet from packet A to packet B =/= A. (That's as of this writing; perhaps this set of events could change.)</p>
<p >One might wonder whether it would be &ndash; overall &ndash; simpler to just have the event API of <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> (the set of on_...() methods) just be those exact events I just listed. Then outside code could just call them when detecting those events. After all, <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> has complex structures keeping track all sorts of details including how many and which packets are In-flight, so <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> and <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a> code could easily detect all those situations.</p>
<p >In fact, that IS how <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> was implemented in the past. Here is why I changed it: There is a small caveat about what "In-flight" means. <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>'s <code>m_snd_flying_pkts_...</code> data structures define "In-flight
packet" as "packet that has been determined to be fit to send over the wire, having passed the availability
and CWND constraints." For <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a>'s ideal operation, "In-flight packet" is defined as "packet that has
been sent over the wire." The practical difference between the two definitions is that the former may be awaiting certain send pacing conditions to actually be sent off; whereas the latter means it has been sent off &ndash; period. (See <code>struct <a class="el" href="structflow_1_1net__flow_1_1Send__pacing__data.html" title="The current outgoing packet pacing state, including queue of low-level packets to be sent,...">Send_pacing_data</a></code> and related code for info on pacing. Essentially, though, any packet that's definitely going to be sent out barring existential disaster may be delayed a bit in a pacing queue to avoid bunching up packets in the pipe.) However, we lack a data structure that specifically stores packets to have been sent off over the wire, except indirectly in <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a5ea56c54a98289211fef4a672432a2ad" title="The collection of all In-flight packets, indexed by sequence number and ordered from most to least re...">Peer_socket::m_snd_flying_pkts_by_sent_when</a> minus <a class="el" href="structflow_1_1net__flow_1_1Send__pacing__data.html#aed68c9912e8c2ada5a9fcef0f9df2331" title="Queue of low-level packets to be sent to the remote endpoint, in order in which they are to be sent,...">Send_pacing_data::m_packet_q</a>. The former is unwieldy for our purposes, let along when combined with the other. So it made more sense to just let outside code report truly In-flight packets appearing and disappearing to us, then we store the (rather minimal) information internally. Thus we separate concerns and divide labor among modules in an accurate fashion instead of <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> becoming ultra-dependent on other modules' implementation details. That said, there is probably some memory cost and (maybe) a little processor cycle cost to this approach. (One could also say that the pacing delay is so minor as to make it ignorable here. However, I decided I don't need the headache of wondering/worrying about that ad infinitum; and solved the problem instead.)</p>
<h3>Update regarding events</h3>
<p >In order to increase performance by smooshing together lots of little checks and actions that might occur when handling lots of little events, namely received acknowledgments, the class user must now bracket groups of <code>on_...()</code> method calls with <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> and <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a>. Thus each <code>on_...()</code> call performs only very basic/quick book-keeping; while <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a> is what compares the situation against what it was at <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> and possibly detects the true events of interest that may actually trigger something (start timer, stop timer, restart running timer).</p>
<h3><code>Timer</code> vs <a class="el" href="namespaceflow_1_1util.html#a74d4a66fb00055be4e1bd6ee98e04667" title="Schedule the given function to execute in a certain amount of time: A handy wrapper around Timer (asi...">util::schedule_task_from_now()</a></h3>
<p >In other places we have tended to replace a <code>Timer</code> with the far simpler <a class="el" href="namespaceflow_1_1util.html#a74d4a66fb00055be4e1bd6ee98e04667" title="Schedule the given function to execute in a certain amount of time: A handy wrapper around Timer (asi...">util::schedule_task_from_now()</a> (etc.) facility (which internally uses a <code>Timer</code> but hides its various annoyances and caveats). Why not here? Answer: We don't happen to use any of <code>Timer</code>'s advanced features that the simpler facility lacks; we just schedule and cancel, and the other facility supports those. So that just leaves the potential performance effects as the reason not to use the simpler facility (as listed in <a class="el" href="namespaceflow_1_1util.html#a74d4a66fb00055be4e1bd6ee98e04667" title="Schedule the given function to execute in a certain amount of time: A handy wrapper around Timer (asi...">util::schedule_task_from_now()</a> doc header). The logic concerning the delay before each scheduled task, and how often it might be canceled and/or rescheduled is not simple. It's hard to make iron-clad guarantees, therefore, that using a single repeatedly-reused <code>Timer</code> is no better perf-wise than using multiple schedulings using the simpler facility. So we do the perf-conservative thing and use <code>Timer</code> despite having to worry about a couple of the associated corner cases.</p>
<p >Or to put it concisely: The timer logic here is complicated, so the perf and flexibility aspects of directly using the advanced <code>Timer</code> feature are suitable.</p>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000060">Todo:</a></b></dt><dd><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> has data members that are references to non-<code>const</code>. These should be pointers for max consistency of style with other code in the project (and that style is encouraged for certain good reasons). Scour rest of code for other such data members as well. </dd></dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00145">145</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>
</div><h2 class="groupheader">Member Typedef Documentation</h2>
<a id="a0930c4da4484ffc1f8bcfbc496e5ecd0" name="a0930c4da4484ffc1f8bcfbc496e5ecd0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0930c4da4484ffc1f8bcfbc496e5ecd0">&#9670;&nbsp;</a></span>packet_id_t</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">using <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">flow::net_flow::Drop_timer::packet_id_t</a> =  <a class="el" href="classflow_1_1net__flow_1_1Sequence__number.html#ab307e12c0cf8cefbe7fb1ec8588af2a8">Sequence_number::seq_num_t</a></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Type to uniquely identify a packet sent over the wire in the socket to which this <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> applies. </p>
<p >Caution: keep in sync with <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a797a524b73e2626fcfefe1be64f4d481" title="Short-hand for order number type. 0 is reserved. Caution: Keep in sync with Drop_timer::packet_id_t.">Peer_socket::order_num_t</a>. That way <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> code can easily form a <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0" title="Type to uniquely identify a packet sent over the wire in the socket to which this Drop_timer applies.">packet_id_t</a> from an <code>order_num_t</code> which, too, uniquely identifies a packet. 0 is reserved, not to be used for any actual packets. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00162">162</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

</div>
</div>
<a id="ad9db6f435dfc65b7bd4b539467f1c3ec" name="ad9db6f435dfc65b7bd4b539467f1c3ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad9db6f435dfc65b7bd4b539467f1c3ec">&#9670;&nbsp;</a></span>timer_wait_id_t</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">using <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">flow::net_flow::Drop_timer::timer_wait_id_t</a> =  uint64_t</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The counter type used to distinguish a given <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> call from any other such call (for this object). </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00297">297</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

</div>
</div>
<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a60e386c24490bd5880e9e8700e59ca6d" name="a60e386c24490bd5880e9e8700e59ca6d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a60e386c24490bd5880e9e8700e59ca6d">&#9670;&nbsp;</a></span>~Drop_timer()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">flow::net_flow::Drop_timer::~Drop_timer </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Destructor. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00316">316</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>.</p>

</div>
</div>
<a id="a9c94b0191a80afb98b6da4a2d0b47a46" name="a9c94b0191a80afb98b6da4a2d0b47a46"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9c94b0191a80afb98b6da4a2d0b47a46">&#9670;&nbsp;</a></span>Drop_timer()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">flow::net_flow::Drop_timer::Drop_timer </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *&#160;</td>
          <td class="paramname"><em>logger</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="namespaceflow_1_1util.html#ac3e89a8a271b0ddc76ac2a0ce488dea4">util::Task_engine</a> *&#160;</td>
          <td class="paramname"><em>node_task_engine</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> *&#160;</td>
          <td class="paramname"><em>sock_drop_timeout</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> &amp;&amp;&#160;</td>
          <td class="paramname"><em>sock</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;err_code)&gt; &amp;&#160;</td>
          <td class="paramname"><em>timer_failure</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(<a class="el" href="classbool.html">bool</a> drop_all_packets)&gt; &amp;&#160;</td>
          <td class="paramname"><em>timer_fired</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Constructs <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> as described in the factory constructor <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </p>
<p >Why have the factory method? We guarantee that this won't get deleted before the timer callback executes (causing a crash therein), by passing a <code>Ptr(this)</code> to <code>basic_waitable_timer::async_wait()</code>. However that can only work if all users of the object also access it by a sharing <code>Ptr</code>. Thus we only provide access to the outside via a <code>Ptr</code> (the factory).</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">logger</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </td></tr>
    <tr><td class="paramname">node_task_engine</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </td></tr>
    <tr><td class="paramname">sock_drop_timeout</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </td></tr>
    <tr><td class="paramname">sock</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </td></tr>
    <tr><td class="paramname">timer_failure</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </td></tr>
    <tr><td class="paramname">timer_fired</td><td>See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a64def367e38954d8a392cdf92fcc8f24" title="Constructs Drop_timer and returns a ref-counted pointer wrapping it.">create_drop_timer()</a>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00293">293</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00028">create_drop_timer()</a>.</p>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a9c94b0191a80afb98b6da4a2d0b47a46_icgraph.svg" width="904" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a64def367e38954d8a392cdf92fcc8f24" name="a64def367e38954d8a392cdf92fcc8f24"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a64def367e38954d8a392cdf92fcc8f24">&#9670;&nbsp;</a></span>create_drop_timer()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Drop_timer::Ptr</a> flow::net_flow::Drop_timer::create_drop_timer </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1log_1_1Logger.html">log::Logger</a> *&#160;</td>
          <td class="paramname"><em>logger_ptr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="namespaceflow_1_1util.html#ac3e89a8a271b0ddc76ac2a0ce488dea4">util::Task_engine</a> *&#160;</td>
          <td class="paramname"><em>node_task_engine</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a> *&#160;</td>
          <td class="paramname"><em>sock_drop_timeout</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> &amp;&amp;&#160;</td>
          <td class="paramname"><em>sock</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;err_code)&gt; &amp;&#160;</td>
          <td class="paramname"><em>timer_failure</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="classflow_1_1Function.html">Function</a>&lt; void(<a class="el" href="classbool.html">bool</a> drop_all_packets)&gt; &amp;&#160;</td>
          <td class="paramname"><em>timer_fired</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Constructs <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> and returns a ref-counted pointer wrapping it. </p>
<p >Saves the "action
callbacks" to call when various events fire in this <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a>. The callbacks may be placed onto <code>*node_task_engine</code> in the manner of <code>post(Task_engine&amp;)</code>, at any future time until <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2" title="Causes the Drop_timer to guarantee none of the action callbacks provided at construction will be call...">done()</a> is called. At construction, the timer is guaranteed not to fire until the first <code>on_...()</code> call.</p>
<p >After construction, call <code>on_...()</code> as events occur. If an event described by the doc comment of an <code>on_...()</code> method occurs, you MUST call it or results are undefined (the state machine breaks down).</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">logger_ptr</td><td>The Logger implementation to use subsequently. </td></tr>
    <tr><td class="paramname">node_task_engine</td><td>The containing <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a>'s <code>&amp;m_task_engine</code>. Asyncronous callbacks will be placed on it (see below). </td></tr>
    <tr><td class="paramname">sock_drop_timeout</td><td>Pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>'s <code>m_snd_drop_timeout.</code> <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> may write to this member if it feels the need to modify Drop Timeout value (as in RFC 6298 section 5.5)! </td></tr>
    <tr><td class="paramname">sock</td><td>Pointer to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>. Access is read-only. </td></tr>
    <tr><td class="paramname">timer_failure</td><td><a class="el" href="classflow_1_1Function.html">Function</a> <code>F</code> with signature <code>void F(const Error_code&amp; err_code)</code>. <code>F(&lt;failure code&gt;)</code> will be called if and only if there was an internal system timer failure. Required action of <code><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a40029643f0a6c7a2a6b20499ca4c5a67" title="Called by boost.asio after we post it, in the event of some timer error.">timer_failure()</a></code>: RST/close with the given error. </td></tr>
    <tr><td class="paramname">timer_fired</td><td><a class="el" href="classflow_1_1Function.html">Function</a> <code>F</code> with signature <code>void F(bool drop_all_packets)</code>. <code>F(drop_all_packets)</code> will be called if and only if the Drop Timer has fired. Required action of <code>timer_fired()</code>: mark either all (if <code>drop_all_packets</code>) or just the earliest (otherwise) In-flight packet(s) as Dropped. </td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>A ref-counted pointer wrapping a newly created <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> as described above. </dd></dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00027">27</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="drop__timer_8cpp_source.html#l00293">Drop_timer()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00556">timer_failure()</a>.</p>

<p class="reference">Referenced by <a class="el" href="peer__socket_8cpp_source.html#l04427">flow::net_flow::Node::setup_drop_timer()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a64def367e38954d8a392cdf92fcc8f24_cgraph.svg" width="351" height="107"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a64def367e38954d8a392cdf92fcc8f24_icgraph.svg" width="1123" height="90"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="ad655d5461aa5a6bf9a80d28e4a4fdd77" name="ad655d5461aa5a6bf9a80d28e4a4fdd77"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad655d5461aa5a6bf9a80d28e4a4fdd77">&#9670;&nbsp;</a></span>disable_timer()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::disable_timer </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Invalidates the running asynchronous wait on <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad5dfc3cd2f8e5e4d28c49e28ee5c221f" title="The Drop Timer itself.">m_timer</a>. Pre-condition: <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9528326a35b021bb859bed948ae3d7a4" title="Is there an active (non-obsolete, not-canceled) asynchronous wait in progress on m_timer?...">m_timer_running</a>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00437">437</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00430">m_current_wait_id</a>, <a class="el" href="drop__timer_8hpp_source.html#l00398">m_timer</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00408">m_timer_running</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00321">done()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>.</p>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_ad655d5461aa5a6bf9a80d28e4a4fdd77_icgraph.svg" width="384" height="120"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="ab6b96e0200579afdee1bf1ce58ab5ad2" name="ab6b96e0200579afdee1bf1ce58ab5ad2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab6b96e0200579afdee1bf1ce58ab5ad2">&#9670;&nbsp;</a></span>done()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::done </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Causes the <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> to guarantee none of the action callbacks provided at construction will be called from this point on. </p>
<p >Call this once you have no need of the <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> (probably upon exiting <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a9537860c2c2a7380a45a525e5121880fa16fdfce85d7bca9386378acd29eb7202" title="Public state is OPEN+CONNECTED; in our opinion the connection is established.">Peer_socket::Int_state::S_ESTABLISHED</a>). Subsequent calls to <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2" title="Causes the Drop_timer to guarantee none of the action callbacks provided at construction will be call...">done()</a> are harmless.</p>
<p >Behavior is undefined if calling any other methods after <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2" title="Causes the Drop_timer to guarantee none of the action callbacks provided at construction will be call...">done()</a>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00321">321</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="drop__timer_8cpp_source.html#l00437">disable_timer()</a>, <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00433">m_done</a>, <a class="el" href="drop__timer_8hpp_source.html#l00436">m_timer_failure</a>, <a class="el" href="drop__timer_8hpp_source.html#l00439">m_timer_fired</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00408">m_timer_running</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_ab6b96e0200579afdee1bf1ce58ab5ad2_cgraph.svg" width="326" height="47"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a45d4cf2dfecc2cd5c35f452cd7c8d05d" name="a45d4cf2dfecc2cd5c35f452cd7c8d05d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a45d4cf2dfecc2cd5c35f452cd7c8d05d">&#9670;&nbsp;</a></span>end_contemporaneous_events()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::end_contemporaneous_events </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Finishes the group started by start <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a>. </p>
<p >This may trigger various on-event behavior such as starting, stopping, or restarting the <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00118">118</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="drop__timer_8cpp_source.html#l00437">disable_timer()</a>, <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="util_2util_8hpp_source.html#l00301">flow::util::key_exists()</a>, <a class="el" href="drop__timer_8hpp_source.html#l00459">m_at_events_start_oldest_flying_packet</a>, <a class="el" href="drop__timer_8hpp_source.html#l00467">m_during_events_newest_acked_packet</a>, <a class="el" href="drop__timer_8hpp_source.html#l00453">m_flying_packets</a>, <a class="el" href="drop__timer_8hpp_source.html#l00473">m_in_events_group</a>, <a class="el" href="drop__timer_8hpp_source.html#l00392">m_sock</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a45d4cf2dfecc2cd5c35f452cd7c8d05d_cgraph.svg" width="575" height="256"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="aaf4f0fce1d41e16309beca40a126e2f0" name="aaf4f0fce1d41e16309beca40a126e2f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaf4f0fce1d41e16309beca40a126e2f0">&#9670;&nbsp;</a></span>handle_timer_firing()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::handle_timer_firing </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a>&#160;</td>
          <td class="paramname"><em>prevent_destruction</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">timer_wait_id_t</a>&#160;</td>
          <td class="paramname"><em>wait_id</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;&#160;</td>
          <td class="paramname"><em>sys_err_code</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (given in constructor). </p>
<p >If <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9de653d7372110ffd176ef34e916a7dd" title="true if and only if done() has been called. Starts at false, can only change to true.">m_done</a> or <code>m_current_wait_id != wait_id</code> or <code>err_code</code> is <code>operation_aborted</code> (meaning this invokation by boost.asio is obsolete and replaced by a subsequent async_wait(), or canceled), does nothing.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">wait_id</td><td>The value of <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aa9af1ac250a1a40f3c8df5878e55b98c" title="Unique (within this object) identifier of the last start_timer() call.">m_current_wait_id</a> at the time that <code>m_timer.async_wait()</code> was called with this method invokation as an argument. </td></tr>
    <tr><td class="paramname">prevent_destruction</td><td><code>shared_from_this()</code> at the time of <code>m_timer.async_wait()</code>. It assures <code>this</code> cannot be deleted until this <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0" title="Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (...">handle_timer_firing()</a> is called and returns. </td></tr>
    <tr><td class="paramname">sys_err_code</td><td>boost.asio error code indicating the circumstances of the callback executing. If this is <code>boost::error::operation_aborted</code>, method does nothing. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00462">462</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="error_2error_8hpp_source.html#l00269">FLOW_ERROR_SYS_ERROR_LOG_WARNING</a>, <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00430">m_current_wait_id</a>, <a class="el" href="drop__timer_8hpp_source.html#l00433">m_done</a>, <a class="el" href="drop__timer_8hpp_source.html#l00392">m_sock</a>, <a class="el" href="drop__timer_8hpp_source.html#l00385">m_sock_drop_timeout</a>, <a class="el" href="drop__timer_8hpp_source.html#l00439">m_timer_fired</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00408">m_timer_running</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_aaf4f0fce1d41e16309beca40a126e2f0_icgraph.svg" width="562" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a477fd69a6978cc228b8e80611aa234ba" name="a477fd69a6978cc228b8e80611aa234ba"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a477fd69a6978cc228b8e80611aa234ba">&#9670;&nbsp;</a></span>on_ack()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::on_ack </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a>&#160;</td>
          <td class="paramname"><em>packet_id</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Indicates that a packet for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> was called has just been validly acked. </p>
<p >To be validly acked means that an acknowledgment was received while the packet was considered In-flight in the <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> sense. See <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a5ea56c54a98289211fef4a672432a2ad" title="The collection of all In-flight packets, indexed by sequence number and ordered from most to least re...">Peer_socket::m_snd_flying_pkts_by_sent_when</a> for definition of In-flight.</p>
<p >Such a packet also requires an <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a5d1fff72b5c044cba0651de0508553e0" title="Indicates that a packet for which on_packet_in_flight() was called is now no longer considered In-fli...">on_packet_no_longer_in_flight()</a> call. You must call <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a477fd69a6978cc228b8e80611aa234ba" title="Indicates that a packet for which on_packet_in_flight() was called has just been validly acked.">on_ack()</a> first; and the latter subsequently. Otherwise behavior is undefined.</p>
<p >A contemporary event group must be in progress via <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a>; or behavior is undefined.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">packet_id</td><td>ID of a packet for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> has been called exactly once for *this. Otherwise behavior is undefined. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00072">72</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="util_2util_8hpp_source.html#l00301">flow::util::key_exists()</a>, <a class="el" href="drop__timer_8hpp_source.html#l00467">m_during_events_newest_acked_packet</a>, <a class="el" href="drop__timer_8hpp_source.html#l00453">m_flying_packets</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00473">m_in_events_group</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a477fd69a6978cc228b8e80611aa234ba_cgraph.svg" width="322" height="47"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="ac5a7ab3108a915999e95ccf705006ccd" name="ac5a7ab3108a915999e95ccf705006ccd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac5a7ab3108a915999e95ccf705006ccd">&#9670;&nbsp;</a></span>on_no_packets_in_flight_any_longer()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::on_no_packets_in_flight_any_longer </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Equivalent to <code>on_packet_no_longer_in_flight(P)</code>, for all <code>P</code> currently In-flight as registered by <code>on_packet_in_flight(P)</code>. </p>
<p >When you know it would be correct, call it instead of the former method many times for better efficiency. (Do not do "both." Trying to register more than once that <code>P</code> is no longer In-flight leads to undefined behavior.)</p>
<p >Calling this when no packets are In-flight already leads to undefined behavior.</p>
<p >A contemporary event group must be in progress via <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a>; or behavior is undefined. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00105">105</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00453">m_flying_packets</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00473">m_in_events_group</a>.</p>

</div>
</div>
<a id="afc1bf0978b04d454f5aa228a44550565" name="afc1bf0978b04d454f5aa228a44550565"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afc1bf0978b04d454f5aa228a44550565">&#9670;&nbsp;</a></span>on_packet_in_flight()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::on_packet_in_flight </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a>&#160;</td>
          <td class="paramname"><em>packet_id</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-level transport, currently UDP). </p>
<p >Subtlety: <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> may consider a packet In-flight before it has actually been sent out over the wire, namely if it is queued in the pacing module. This should be called only once it is actually sent. Note, however, that IF <code>on_packet_in_flight(P)</code> is called, then indeed the packet identified by <code>P</code> <em>must</em> be considered In-flight in the <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> sense. See <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a5ea56c54a98289211fef4a672432a2ad" title="The collection of all In-flight packets, indexed by sequence number and ordered from most to least re...">Peer_socket::m_snd_flying_pkts_by_sent_when</a> for definition of In-flight.</p>
<p >A contemporary event group must be in progress via <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a>; or behavior is undefined.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">packet_id</td><td>ID of the packet that was sent out. This can be any number as long as it increases with each subsequent call to this method for <code>*this <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a></code> (in particular, it'll therefore also be unique per <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a>). Behavior is undefined if this rule is not followed. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00052">52</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00453">m_flying_packets</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00473">m_in_events_group</a>.</p>

</div>
</div>
<a id="a5d1fff72b5c044cba0651de0508553e0" name="a5d1fff72b5c044cba0651de0508553e0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5d1fff72b5c044cba0651de0508553e0">&#9670;&nbsp;</a></span>on_packet_no_longer_in_flight()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::on_packet_no_longer_in_flight </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a>&#160;</td>
          <td class="paramname"><em>packet_id</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Indicates that a packet for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> was called is now no longer considered In-flight in the <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> sense; see <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a5ea56c54a98289211fef4a672432a2ad" title="The collection of all In-flight packets, indexed by sequence number and ordered from most to least re...">Peer_socket::m_snd_flying_pkts_by_sent_when</a> for definition of In-flight. </p>
<p >Since <code>on_packet_in_flight(P)</code> must be called only if <code>P</code> was then In-flight, <code>on_packet_no_longer_in_flight(P)</code> can be called at most once and only after the former call.</p>
<p >A contemporary event group must be in progress via <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a>; or behavior is undefined.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">packet_id</td><td>ID of a packet for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> has been called exactly once for <code>*this</code>. Otherwise behavior is undefined. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00092">92</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00453">m_flying_packets</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00473">m_in_events_group</a>.</p>

</div>
</div>
<a id="abf88c319884e5c5eb1b8f63c646e90ad" name="abf88c319884e5c5eb1b8f63c646e90ad"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abf88c319884e5c5eb1b8f63c646e90ad">&#9670;&nbsp;</a></span>start_contemporaneous_events()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::start_contemporaneous_events </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Indicates the start of a series of zero or more contemporary <code>on_*()</code> event calls, to be marked as finished via <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a>. </p>
<p >Contemporary means to be treated as occurring in that order but essentially simultaneously. (It is recommended but not enforced that they be registered in the same boost.asio task.) This call should be followed by the 0+ <code>on_*()</code> calls; and finally <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a>. Grouping events in this way allows for better performance than, for example, a series of one-event groups. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00041">41</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="drop__timer_8hpp_source.html#l00459">m_at_events_start_oldest_flying_packet</a>, <a class="el" href="drop__timer_8hpp_source.html#l00467">m_during_events_newest_acked_packet</a>, <a class="el" href="drop__timer_8hpp_source.html#l00453">m_flying_packets</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00473">m_in_events_group</a>.</p>

</div>
</div>
<a id="a4a5f0bbb91232e17e258722e4dfa237b" name="a4a5f0bbb91232e17e258722e4dfa237b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4a5f0bbb91232e17e258722e4dfa237b">&#9670;&nbsp;</a></span>start_timer()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::start_timer </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO value. </p>
<p >Pre-condition: <code>!m_timer_running</code>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00347">347</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="log_8hpp_source.html#l00227">FLOW_LOG_TRACE</a>, <a class="el" href="log_8cpp_source.html#l00222">flow::log::Log_context::get_log_component()</a>, <a class="el" href="log_8cpp_source.html#l00217">flow::log::Log_context::get_logger()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>, <a class="el" href="drop__timer_8hpp_source.html#l00430">m_current_wait_id</a>, <a class="el" href="drop__timer_8hpp_source.html#l00392">m_sock</a>, <a class="el" href="drop__timer_8hpp_source.html#l00385">m_sock_drop_timeout</a>, <a class="el" href="drop__timer_8hpp_source.html#l00398">m_timer</a>, <a class="el" href="drop__timer_8hpp_source.html#l00408">m_timer_running</a>, and <a class="el" href="classflow_1_1log_1_1Logger.html#ac8a2e7a33fe3fbc0c29ead62ed98c022">flow::log::Logger::should_log()</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>.</p>
<div class="dynheader">
Here is the call graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a4a5f0bbb91232e17e258722e4dfa237b_cgraph.svg" width="332" height="240"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a4a5f0bbb91232e17e258722e4dfa237b_icgraph.svg" width="379" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<a id="a40029643f0a6c7a2a6b20499ca4c5a67" name="a40029643f0a6c7a2a6b20499ca4c5a67"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a40029643f0a6c7a2a6b20499ca4c5a67">&#9670;&nbsp;</a></span>timer_failure()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">void flow::net_flow::Drop_timer::timer_failure </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aa4f1af88393042e60159a3a67f0accbc">Ptr</a>&#160;</td>
          <td class="paramname"><em>prevent_destruction</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a> &amp;&#160;</td>
          <td class="paramname"><em>err_code</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Called by boost.asio after we post it, in the event of some timer error. </p>
<p >If <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9de653d7372110ffd176ef34e916a7dd" title="true if and only if done() has been called. Starts at false, can only change to true.">m_done</a>, does nothing (meaning the object was turned off before this had a chance to be executed). Otherwise executes the <code><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a21e78b9da6196043e1c05589c46911fa" title="Called on error. See Drop_timer constructor.">m_timer_failure()</a></code> callback.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">prevent_destruction</td><td><code>shared_from_this()</code> at the time of <code>m_timer.async_wait()</code>. It assures <code>this</code> cannot be deleted until <code>this-&gt;<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0" title="Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (...">handle_timer_firing()</a></code> is called and returns. </td></tr>
    <tr><td class="paramname">err_code</td><td>The portable error to pass to the <code><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a21e78b9da6196043e1c05589c46911fa" title="Called on error. See Drop_timer constructor.">m_timer_failure()</a></code>. </td></tr>
  </table>
  </dd>
</dl>

<p class="definition">Definition at line <a class="el" href="drop__timer_8cpp_source.html#l00556">556</a> of file <a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a>.</p>

<p class="reference">References <a class="el" href="drop__timer_8hpp_source.html#l00433">m_done</a>, and <a class="el" href="drop__timer_8hpp_source.html#l00436">m_timer_failure</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00028">create_drop_timer()</a>.</p>
<div class="dynheader">
Here is the caller graph for this function:</div>
<div class="dyncontent">
<div class="center"><iframe scrolling="no" frameborder="0" src="classflow_1_1net__flow_1_1Drop__timer_a40029643f0a6c7a2a6b20499ca4c5a67_icgraph.svg" width="904" height="59"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe>
</div>
</div>

</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="a2ae6617225acb8c4b0798f113c1827d0" name="a2ae6617225acb8c4b0798f113c1827d0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2ae6617225acb8c4b0798f113c1827d0">&#9670;&nbsp;</a></span>m_at_events_start_oldest_flying_packet</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> flow::net_flow::Drop_timer::m_at_events_start_oldest_flying_packet</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The packet ID of the least recently sent In-flight packet at last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> call; or 0 if <code>m_flying_packets.empty()</code> at the time. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00459">459</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00041">start_contemporaneous_events()</a>.</p>

</div>
</div>
<a id="aa9af1ac250a1a40f3c8df5878e55b98c" name="aa9af1ac250a1a40f3c8df5878e55b98c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa9af1ac250a1a40f3c8df5878e55b98c">&#9670;&nbsp;</a></span>m_current_wait_id</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec">timer_wait_id_t</a> flow::net_flow::Drop_timer::m_current_wait_id</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Unique (within this object) identifier of the last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> call. </p>
<p >Each time <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> calls <code>boost::asio::basic_waitable_timer::async_wait()</code>, it passes <code>++m_current_wait_id</code> to the timer firing callback. Then when that callback runs, it can check whether this passed <code>wait_id</code> is equal to <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aa9af1ac250a1a40f3c8df5878e55b98c" title="Unique (within this object) identifier of the last start_timer() call.">m_current_wait_id</a>; if not then it knows the callback is called for an obsolete wait and should do nothing. This is to help deal with the fact that a <code>basic_waitable_timer</code> callback can fire after it is <code>cancel()</code>ed if the callback was already queued by the time <code>cancel()</code> is called (see <code>boost::asio::basic_waitable_timer</code> documentation).</p>
<p >For example, if I schedule wait 1, and it is queued to fire 5 seconds later, but at that point something causes me to cancel and schedule wait 2 for another 5 seconds later, then wait 1's callback, though soon called, will detect that <code>wait_id &lt; m_current_wait_id</code> and do nothing, as desired. Another 5 seconds later, wait 2's callback will see that <code>wait_id == m_current_wait_id</code> and do stuff, as desired.</p>
<p >This must only change via increment and start at zero. Wrap-around is impossible due to the range of <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad9db6f435dfc65b7bd4b539467f1c3ec" title="The counter type used to distinguish a given start_timer() call from any other such call (for this ob...">timer_wait_id_t</a> and the time periods practically involved.</p>
<p ><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aa9af1ac250a1a40f3c8df5878e55b98c" title="Unique (within this object) identifier of the last start_timer() call.">m_current_wait_id</a> should not be checked unless <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9528326a35b021bb859bed948ae3d7a4" title="Is there an active (non-obsolete, not-canceled) asynchronous wait in progress on m_timer?...">m_timer_running</a>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00430">430</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00437">disable_timer()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>

</div>
</div>
<a id="a9de653d7372110ffd176ef34e916a7dd" name="a9de653d7372110ffd176ef34e916a7dd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9de653d7372110ffd176ef34e916a7dd">&#9670;&nbsp;</a></span>m_done</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Drop_timer::m_done</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p><code>true</code> if and only if <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ab6b96e0200579afdee1bf1ce58ab5ad2" title="Causes the Drop_timer to guarantee none of the action callbacks provided at construction will be call...">done()</a> has been called. Starts at <code>false</code>, can only change to <code>true</code>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00433">433</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00321">done()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00556">timer_failure()</a>.</p>

</div>
</div>
<a id="a0d90b548d2c7062e1ac88b998a2fc1d5" name="a0d90b548d2c7062e1ac88b998a2fc1d5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0d90b548d2c7062e1ac88b998a2fc1d5">&#9670;&nbsp;</a></span>m_during_events_newest_acked_packet</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a> flow::net_flow::Drop_timer::m_during_events_newest_acked_packet</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>During the time period starting with the last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> call and ending with the subsequent <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a> call, if any &ndash; in other words, during the last contemporary events group, finished or otherwise &ndash; this is the ID of the most-recently-sent packet (highest packet ID) such that that packet was acknowledged during that time period. </p>
<p >0 if none were acknowledged. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00467">467</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00072">on_ack()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00041">start_contemporaneous_events()</a>.</p>

</div>
</div>
<a id="a83bacd0cfe7c6fb6349688012d472f1f" name="a83bacd0cfe7c6fb6349688012d472f1f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a83bacd0cfe7c6fb6349688012d472f1f">&#9670;&nbsp;</a></span>m_flying_packets</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">std::set&lt;<a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a0930c4da4484ffc1f8bcfbc496e5ecd0">packet_id_t</a>&gt; flow::net_flow::Drop_timer::m_flying_packets</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Packet IDs of packets to have been sent over wire and still considered In-flight, ordered from earliest to latest to have been sent out. </p>
<p >These are packet IDs for which <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> but not yet <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a5d1fff72b5c044cba0651de0508553e0" title="Indicates that a packet for which on_packet_in_flight() was called is now no longer considered In-fli...">on_packet_no_longer_in_flight()</a> has been called.</p>
<p >Since the iterator ordering is increasing numerical order (ordered set of <code>packet_id</code>s), and <code>packet_id</code>s passed to <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#afc1bf0978b04d454f5aa228a44550565" title="Indicates that a packet identified by the given unique ID has just been sent over the wire (the low-l...">on_packet_in_flight()</a> must be increasing from call to call, the aforementioned ordering (by time sent) is expressed via the iterator ordering. Thus the earliest-sent packet is easily accessible via <code>begin()</code>; this is needed for certain drop-timer situations.</p>
<p >Logarithmic-time erasure for <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a5d1fff72b5c044cba0651de0508553e0" title="Indicates that a packet for which on_packet_in_flight() was called is now no longer considered In-fli...">on_packet_no_longer_in_flight()</a> is also available. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00453">453</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00072">on_ack()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00105">on_no_packets_in_flight_any_longer()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00052">on_packet_in_flight()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00092">on_packet_no_longer_in_flight()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00041">start_contemporaneous_events()</a>.</p>

</div>
</div>
<a id="addd06c5f17e59cbfd70677831a66bc57" name="addd06c5f17e59cbfd70677831a66bc57"></a>
<h2 class="memtitle"><span class="permalink"><a href="#addd06c5f17e59cbfd70677831a66bc57">&#9670;&nbsp;</a></span>m_in_events_group</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Drop_timer::m_in_events_group</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p><code>true</code> if and only if the last <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#abf88c319884e5c5eb1b8f63c646e90ad" title="Indicates the start of a series of zero or more contemporary on_*() event calls, to be marked as fini...">start_contemporaneous_events()</a> call exists, and either <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a45d4cf2dfecc2cd5c35f452cd7c8d05d" title="Finishes the group started by start start_contemporaneous_events().">end_contemporaneous_events()</a> hasn't been called at all or was called before the former call. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00473">473</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00072">on_ack()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00105">on_no_packets_in_flight_any_longer()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00052">on_packet_in_flight()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00092">on_packet_no_longer_in_flight()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00041">start_contemporaneous_events()</a>.</p>

</div>
</div>
<a id="ac3cfab1594111b3c3254eebc84591908" name="ac3cfab1594111b3c3254eebc84591908"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac3cfab1594111b3c3254eebc84591908">&#9670;&nbsp;</a></span>m_node_task_engine</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="namespaceflow_1_1util.html#ac3e89a8a271b0ddc76ac2a0ce488dea4">util::Task_engine</a>&amp; flow::net_flow::Drop_timer::m_node_task_engine</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p><a class="el" href="classflow_1_1net__flow_1_1Node.html#af5597a417d03e2bed87cd772ef5cef29" title="The main loop engine, functioning in the single-threaded-but-asynchronous callback-based &quot;reactor&quot; st...">Node::m_task_engine</a> of the containing <a class="el" href="classflow_1_1net__flow_1_1Node.html" title="An object of this class is a single Flow-protocol networking node, in the sense that: (1) it has a di...">Node</a>. Used to schedule timer events. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00376">376</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

</div>
</div>
<a id="a7ab957ddc07d6289d1b42d6686173533" name="a7ab957ddc07d6289d1b42d6686173533"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7ab957ddc07d6289d1b42d6686173533">&#9670;&nbsp;</a></span>m_sock</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">const <a class="el" href="classflow_1_1util_1_1Shared__ptr__alias__holder.html#aef7998db71c60eeb5d1e3d1a97c14886">Peer_socket::Const_ptr</a> flow::net_flow::Drop_timer::m_sock</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a> (note that this is read-only access). </p>
<p >This may be used to, at least, get the time point at which a packet was originally sent, to schedule the timer, as well to get socket options related to Drop Timer. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00392">392</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00118">end_contemporaneous_events()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>

</div>
</div>
<a id="ad9db83f50aec60604de55d01e15ea403" name="ad9db83f50aec60604de55d01e15ea403"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad9db83f50aec60604de55d01e15ea403">&#9670;&nbsp;</a></span>m_sock_drop_timeout</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="namespaceflow.html#a48799f1263cdeedec125be51a3db2b79">Fine_duration</a>&amp; flow::net_flow::Drop_timer::m_sock_drop_timeout</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Reference to the containing <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html" title="A peer (non-server) socket operating over the Flow network protocol, with optional stream-of-bytes an...">Peer_socket</a>'s <a class="el" href="classflow_1_1net__flow_1_1Peer__socket.html#a2d8aded3761028967fd3abb464e64936" title="The Drop Timeout: Time period between the next time m_snd_drop_timer schedules a Drop Timer and that ...">Peer_socket::m_snd_drop_timeout</a> data member (= DTO, Drop Timeout, RTO). </p>
<p >Why is this not <code>const</code>? Because under certain policies this object is allowed to CHANGE the value of the DTO. E.g., RFC 6298 says that RTO MUST be doubled each time the Retransmit Timer fires. (However a subsequent RTT measurement and SRTT recalculation will change it back to the normally computed value.) </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00385">385</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>

</div>
</div>
<a id="ad5dfc3cd2f8e5e4d28c49e28ee5c221f" name="ad5dfc3cd2f8e5e4d28c49e28ee5c221f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad5dfc3cd2f8e5e4d28c49e28ee5c221f">&#9670;&nbsp;</a></span>m_timer</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="namespaceflow_1_1util.html#ae7416d64d2989051104bb396e28e15e6">util::Timer</a> flow::net_flow::Drop_timer::m_timer</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>The Drop Timer itself. </p>
<p >This class maintains it (including based on input events reported by the user) and informs the user when it expires and what to do about it if so. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00398">398</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00437">disable_timer()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>

</div>
</div>
<a id="a21e78b9da6196043e1c05589c46911fa" name="a21e78b9da6196043e1c05589c46911fa"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a21e78b9da6196043e1c05589c46911fa">&#9670;&nbsp;</a></span>m_timer_failure</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1Function.html">Function</a>&lt;void (const <a class="el" href="namespaceflow.html#a29eaaa9d0fac4ce87d8b969222dbed09">Error_code</a>&amp; err_code)&gt; flow::net_flow::Drop_timer::m_timer_failure</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Called on error. See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> constructor. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00436">436</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00321">done()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00556">timer_failure()</a>.</p>

</div>
</div>
<a id="a862595a7ec5d4bea05ad0e85c52e88ac" name="a862595a7ec5d4bea05ad0e85c52e88ac"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a862595a7ec5d4bea05ad0e85c52e88ac">&#9670;&nbsp;</a></span>m_timer_fired</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classflow_1_1Function.html">Function</a>&lt;void (<a class="el" href="classbool.html">bool</a> drop_all_packets)&gt; flow::net_flow::Drop_timer::m_timer_fired</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Called on Drop Timeout. See <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html" title="Internal net_flow class that maintains the Drop Timer for DATA packet(s) to have been sent out over a...">Drop_timer</a> constructor. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00439">439</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00321">done()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>.</p>

</div>
</div>
<a id="a9528326a35b021bb859bed948ae3d7a4" name="a9528326a35b021bb859bed948ae3d7a4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9528326a35b021bb859bed948ae3d7a4">&#9670;&nbsp;</a></span>m_timer_running</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classbool.html">bool</a> flow::net_flow::Drop_timer::m_timer_running</td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">private</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Is there an active (non-obsolete, not-canceled) asynchronous wait in progress on <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad5dfc3cd2f8e5e4d28c49e28ee5c221f" title="The Drop Timer itself.">m_timer</a>? More precisely, this is <code>true</code> if the latest <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> call was later than the latest <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad655d5461aa5a6bf9a80d28e4a4fdd77" title="Invalidates the running asynchronous wait on m_timer. Pre-condition: m_timer_running.">disable_timer()</a> or <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0" title="Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (...">handle_timer_firing()</a>, or if <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a4a5f0bbb91232e17e258722e4dfa237b" title="Starts a new wait on the timer, so that is it asynchronously triggered according to the current DTO v...">start_timer()</a> has been called but <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#ad655d5461aa5a6bf9a80d28e4a4fdd77" title="Invalidates the running asynchronous wait on m_timer. Pre-condition: m_timer_running.">disable_timer()</a> or <a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#aaf4f0fce1d41e16309beca40a126e2f0" title="Called by boost.asio when the Drop Timer fires; disables timer and calls an outside action callback (...">handle_timer_firing()</a> has not. </p>
<p ><a class="el" href="classflow_1_1net__flow_1_1Drop__timer.html#a9528326a35b021bb859bed948ae3d7a4" title="Is there an active (non-obsolete, not-canceled) asynchronous wait in progress on m_timer?...">m_timer_running</a> should not be checked unless <code>!m_done</code>. </p>

<p class="definition">Definition at line <a class="el" href="drop__timer_8hpp_source.html#l00408">408</a> of file <a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a>.</p>

<p class="reference">Referenced by <a class="el" href="drop__timer_8cpp_source.html#l00437">disable_timer()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00321">done()</a>, <a class="el" href="drop__timer_8cpp_source.html#l00462">handle_timer_firing()</a>, and <a class="el" href="drop__timer_8cpp_source.html#l00347">start_timer()</a>.</p>

</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>net_flow/detail/<a class="el" href="drop__timer_8hpp_source.html">drop_timer.hpp</a></li>
<li>net_flow/detail/<a class="el" href="drop__timer_8cpp_source.html">drop_timer.cpp</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
